home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 5 / MacMania 5.toast / / Internet software / NewsWatcher / NW Source / Source / charset.c < prev    next >
Text File  |  1997-01-09  |  4KB  |  177 lines

  1. /*----------------------------------------------------------------------------
  2.  
  3.     charset.c
  4.  
  5.     This module deals with character set issues (currently only 
  6.     ISO 8859-1, Latin-1).
  7.     
  8.     Copyright © 1994-1997, Northwestern University.
  9.  
  10. ----------------------------------------------------------------------------*/
  11.  
  12. #include <string.h>
  13.  
  14. #include "glob.h"
  15. #include "charset.h"
  16. #include "header.h"
  17. #include "memutil.h"
  18. #include "resutil.h"
  19.  
  20.  
  21.  
  22. #define kLatin1ToMacTableID        1001
  23. #define kMacToLatin1TableID        1002
  24.  
  25. #define kTableRsrcType                'taBL'
  26.  
  27.  
  28.  
  29. static unsigned char **gLatin1ToMacTable = nil;
  30. static unsigned char **gMacToLatin1Table = nil;
  31.  
  32.  
  33.  
  34. /*----------------------------------------------------------------------------
  35.     MapLatin1ToMacPtr
  36.     
  37.     Map Latin-1 8 bit characters to Mac 8 bit characters.
  38.     
  39.     Entry:    ptr = pointer to text to be mapped.
  40.             len = length of text.
  41.     
  42.     Exit:    function result = true if any 8 bit characters encountered.
  43. ----------------------------------------------------------------------------*/
  44.  
  45. Boolean MapLatin1ToMacPtr (char *ptr, long len)
  46. {
  47.     unsigned char *p, *pEnd;
  48.     Boolean result = false;
  49.     OSErr err = noErr;
  50.     unsigned char *table;
  51.     
  52.     if (gLatin1ToMacTable == nil) {
  53.         err = MyGet1Resource(kTableRsrcType, kLatin1ToMacTableID, &gLatin1ToMacTable);
  54.         if (err != noErr) return false;
  55.     }
  56.     table = *gLatin1ToMacTable;
  57.     for (p = (unsigned char*)ptr, pEnd = p + len; p < pEnd; p++) {
  58.         if ((char)*p < 0) {
  59.             *p = table[*p];
  60.             result = true;
  61.         }
  62.     }
  63.     return result;
  64. }
  65.  
  66.  
  67.  
  68. /*----------------------------------------------------------------------------
  69.     MapLatin1ToMacHandle
  70.     
  71.     Map Latin-1 8 bit characters to Mac 8 bit characters.
  72.     
  73.     Entry:    text = handle to text to be mapped.
  74.     
  75.     Exit:    function result = true if any 8 bit characters encountered.
  76. ----------------------------------------------------------------------------*/
  77.  
  78. Boolean MapLatin1ToMacHandle (Handle text)
  79. {
  80.     char state;
  81.     Boolean result;
  82.     
  83.     state = MyHGetState(text);
  84.     MyHLock(text);
  85.     result = MapLatin1ToMacPtr(*text, MyGetHandleSize(text));
  86.     MyHSetState(text, state);
  87.     return result;
  88. }
  89.  
  90.  
  91.  
  92. /*----------------------------------------------------------------------------
  93.     MapLatin1ToMacStr
  94.     
  95.     Map Latin-1 8 bit characters to Mac 8 bit characters.
  96.     
  97.     Entry:    str1 = pointer to source string.
  98.             str2 = pointer to destination string (may be same as str1).
  99.     
  100.     Exit:    function result = true if any 8 bit characters encountered.
  101. ----------------------------------------------------------------------------*/
  102.  
  103. void MapLatin1ToMacStr (char *str1, char *str2)
  104. {
  105.     unsigned char *p, *q;
  106.     OSErr err = noErr;
  107.     unsigned char *table;
  108.     
  109.     if (gLatin1ToMacTable == nil) {
  110.         err = MyGet1Resource(kTableRsrcType, kLatin1ToMacTableID, &gLatin1ToMacTable);
  111.         if (err != noErr) return;
  112.     }
  113.     table = *gLatin1ToMacTable;
  114.     for (p = (unsigned char*)str1, q = (unsigned char*)str2; *p != 0; p++, q++) {
  115.         *q = table[*p];
  116.     }
  117.     *q = 0;
  118. }    
  119.  
  120.  
  121.  
  122. /*----------------------------------------------------------------------------
  123.     MapMacToLatin1Ptr
  124.     
  125.     Map Mac 8 bit characters to Latin-1 8 bit characters.
  126.     
  127.     Entry:    ptr = pointer to text to be mapped.
  128.             len = length of text.
  129.     
  130.     Exit:    function result = true if any 8 bit characters encountered.
  131. ----------------------------------------------------------------------------*/
  132.  
  133. Boolean MapMacToLatin1Ptr (char *ptr, long len)
  134. {
  135.     unsigned char *p, *pEnd;
  136.     Boolean result = false;
  137.     OSErr err = noErr;
  138.     unsigned char *table;
  139.     
  140.     if (gMacToLatin1Table == nil) {
  141.         err = MyGet1Resource(kTableRsrcType, kMacToLatin1TableID, &gMacToLatin1Table);
  142.         if (err != noErr) return false;
  143.     }
  144.     table = *gMacToLatin1Table;
  145.     for (p = (unsigned char*)ptr, pEnd = p + len; p < pEnd; p++) {
  146.         if ((char)*p < 0) {
  147.             *p = table[*p];
  148.             result = true;
  149.         }
  150.     }
  151.     return result;
  152. }
  153.  
  154.  
  155.  
  156. /*----------------------------------------------------------------------------
  157.     MapMacToLatin1Handle
  158.     
  159.     Map Mac 8 bit characters to Latin-1 8 bit characters.
  160.     
  161.     Entry:    text = handle to text to be mapped.
  162.     
  163.     Exit:    function result = true if any 8 bit characters encountered.
  164. ----------------------------------------------------------------------------*/
  165.  
  166. Boolean MapMacToLatin1Handle (Handle text)
  167. {
  168.     char state;
  169.     Boolean result;
  170.     
  171.     state = MyHGetState(text);
  172.     MyHLock(text);
  173.     result = MapMacToLatin1Ptr(*text, MyGetHandleSize(text));
  174.     MyHSetState(text, state);
  175.     return result;
  176. }
  177.